package P6;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;
import java.io.*;
import java.security.KeyStore;


/**
 * 编写一个 ECHO SSL 服务器程序和一个 ECHO SSL 客户端程序，实现以下功能：
 * 1.服务器端监听指定的端口，并等待客户端连接。
 * 2.客户端连接到指定的 SSL 服务器，并建立 SSL 连接。
 * 3.客户端发送一个字符串消息到服务器端，并等待服务器端的响应。
 * 4.服务器端接收客户端发送的消息，并返回一个响应消息。
 * 5.客户端打印服务器端返回的消息，如果客户发送的消息为bye，结束通信，并关闭 SSL 连接。
 * 6.服务器端继续监听并等待下一个客户端连接。
 * 提示：
 * 1.可以使用 Java 标准库中的 SSLServerSocket 和 SSLSocket 类来实现 SSL 服务器和客户端。
 * 2.可以使用 KeyStore 类来加载服务器端证书和私钥，以便进行 SSL 握手认证。
 * 3.可以使用 TrustManager 类来加载客户端证书，以便进行 SSL 握手认证。
 */
public class EchoClient {
    private static final String SERVER_HOST = "localhost";
    private static final int SERVER_PORT = 8888;
    private static final String KEYSTORE_PATH = "path/to/keystore.jks";
    private static final String KEYSTORE_PASSWORD = "keystore_password";

    public static void main(String[] args) {
        try {
            // 加载密钥库
            KeyStore keyStore = KeyStore.getInstance("JKS");
            FileInputStream fis = new FileInputStream(KEYSTORE_PATH);
            keyStore.load(fis, KEYSTORE_PASSWORD.toCharArray());
            fis.close();

            // 创建 SSL 上下文
            SSLContext sslContext = SSLContext.getInstance("TLS");
            TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
            trustManagerFactory.init(keyStore);
            sslContext.init(null, trustManagerFactory.getTrustManagers(), null);

            // 创建 SSL 客户端套接字
            SSLSocketFactory socketFactory = sslContext.getSocketFactory();
            SSLSocket socket = (SSLSocket) socketFactory.createSocket(SERVER_HOST, SERVER_PORT);

            // 启动握手
            socket.startHandshake();

            // 创建输入输出流
            InputStream inputStream = socket.getInputStream();
            OutputStream outputStream = socket.getOutputStream();

            // 发送消息给服务器
            String message = "Hello, server!";
            outputStream.write(message.getBytes());
            outputStream.flush();

            // 接收服务器返回的消息
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            String response = reader.readLine();
            System.out.println("Server response: " + response);

            // 关闭连接
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


//package P6;
//
//import javax.net.ssl.*;
//import java.io.*;
//import java.net.*;
//import java.nio.ByteBuffer;
//import java.security.KeyStore;
//
//public class EchoClient {
//    private static final String SERVER_HOST = "localhost";
//    private static final int SERVER_PORT = 8888;
//    private static final String KEYSTORE_PATH = "path/to/keystore.jks";
//    private static final String KEYSTORE_PASSWORD = "keystore_password";
//
//    public static void main(String[] args) {
//        try {
//            // 加载密钥库
//            KeyStore keyStore = KeyStore.getInstance("JKS");
//            FileInputStream fis = new FileInputStream(KEYSTORE_PATH);
//            keyStore.load(fis, KEYSTORE_PASSWORD.toCharArray());
//
//            // 创建 SSL 上下文
//            SSLContext sslContext = SSLContext.getInstance("TLS");
//            TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
//            trustManagerFactory.init(keyStore);
//            sslContext.init(null, trustManagerFactory.getTrustManagers(), null);
//
//            // 创建 SSL 客户端套接字
//            SSLSocketFactory socketFactory = sslContext.getSocketFactory();
//            SSLSocket socket = (SSLSocket) socketFactory.createSocket(SERVER_HOST, SERVER_PORT);
//
//            // 创建 SSL 输入输出流
//            SSLSession sslSession = socket.getSession();
//            InputStream inputStream = socket.getInputStream();
//            OutputStream outputStream = socket.getOutputStream();
//            SSLInputStream sslInputStream = new SSLInputStream(inputStream, socket);
//            SSLOutputStream sslOutputStream = new SSLOutputStream(outputStream, socket);
//
//            // 发送消息给服务器
//            String message = "Hello, server!";
//            sslOutputStream.write(message.getBytes());
//            sslOutputStream.flush();
//
//            // 接收服务器返回的消息
//            ByteBuffer buffer = ByteBuffer.allocate(1024);
//            int bytesRead = sslInputStream.read(buffer);
//            String response = new String(buffer.array(), 0, bytesRead);
//            System.out.println("Server response: " + response);
//
//            // 关闭连接
//            socket.close();
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
//}